﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Fuyao.Business.Entities.Models;
using Fuyao.Business.Logic.BC;
using Fuyao.Win.UI.Util;
using Fuyao.Win.UI.Common;
using Fuyao.Win.UI.Mantenimientos;

namespace Fuyao.Win.UI.Ventas
{
    public partial class frmGuiaRemision_ : Form
    {
        BusinessLogic bc = new BusinessLogic();
        #region Propiedades
        public bool valOpcion { get; set; }
        public bool action { get; set; }
        public GuiaRemision beGuiaRemision { get; set; }
        #endregion
        Venta beVenta;
        public int GuiaRemisionId { get; set; }

        public frmGuiaRemision_()
        {
            InitializeComponent();
        }

        private void frmGuiaRemision_Load(object sender, EventArgs e)
        {
            desabilitaControles();
            this.txtSerieComprobante.Text = bc.getNumeroSerie("TableName", Constantes.PARAMETRO_SerieFactura);
            cargarNroSerie();
            this.txtNumeroComprobante.Focus();
            this.txtPuntoPartida.Text = Constantes.ADDRESS_FUYAO;
            Utilitarios.configurarGrilla(ref dgvDetalles);
            setColumnasGrilla();
            cargarCboMotivoTraslado();
            if (beGuiaRemision == null) newGuiaRemision();
            else
            {
                
            }
        }

        private void cargarNroSerie()
        {
            this.txtSerie.Text = bc.getNumeroSerie("TableName", Constantes.PARAMETRO_SerieGuiaRemision);
        }

        private void desabilitaControles()
        {
            this.txtRazonSocial.ReadOnly = true;
            this.txtRazonSocial.BackColor = Color.White;
            this.txtRuc.ReadOnly = true;
            this.txtRuc.BackColor = Color.White;
            this.txtDni.ReadOnly = true;
            this.txtDni.BackColor = Color.White;
        }

        private void setColumnasGrilla()
        {
            colProducto.DataPropertyName = "CodigoProducto";
            colDescripcion.DataPropertyName = "DescripcionProducto";
            colCantidad.DataPropertyName = "Cantidad";
            colPrecio.DataPropertyName = "PrecioUnitario";
            colImporte.DataPropertyName = "Importe";
        }

        private void cargarCboMotivoTraslado()
        {
            Utilitarios.cargarCboEstadosParametrosTable(this.cboMotivoTraslado, Constantes.PARAMETRO_MotivoGuiaRemision);
        }

        private void newGuiaRemision()
        {
            beGuiaRemision = new GuiaRemision();
            beGuiaRemision.DetalleGuiaRemisions = new List<DetalleGuiaRemision>();
        }

        private void frmGuiaRemision_KeyPress(object sender, KeyPressEventArgs e)
        {
            Utilitarios.cerrarFormularioEscape(e, this);
        }

        private void txtNroDocumentoGuia_KeyPress(object sender, KeyPressEventArgs e)
        {
            Utilitarios.vSoloNumeros(e);
        }

        private void rdbFactura_CheckedChanged(object sender, EventArgs e)
        {
            if (rdbFactura.Checked) this.txtSerieComprobante.Text = bc.getNumeroSerie("TableName", Constantes.PARAMETRO_SerieFactura);
        }

        private void rdbBoleta_CheckedChanged(object sender, EventArgs e)
        {
            if (rdbBoleta.Checked) this.txtSerieComprobante.Text = bc.getNumeroSerie("TableName", Constantes.PARAMETRO_SerieBoleta);

        }

        private void btnBuscarComprobante_Click(object sender, EventArgs e)
        {
            if (String.IsNullOrEmpty(txtSerieComprobante.Text))
            {
                ErrorProv.SetError(txtSerieComprobante, "No se ha cargado el número de serie para el comprobante seleccionado");
                return;
            }

            if (txtNumeroComprobante.Text == "000000")
            {
                ErrorProv.SetError(txtNumeroComprobante, "Ingrese el número de comprobante a buscar");
                return;
            }

            if (txtNumeroComprobante.Text.Length !=  6)
            {
                ErrorProv.SetError(txtNumeroComprobante, "Formato incorrecto del número de comprobante");
                return;
            }
            BuscarComprobante();
        }

        private void BuscarComprobante()
        {
            Venta oVenta = bc.getVentaforGuiaRemision((this.rdbFactura.Checked ? "F" : "B"),this.txtSerieComprobante.Text,this.txtNumeroComprobante.Text);
            if (oVenta == null)
            {
                if (MessageBox.Show("La " + (this.rdbFactura.Checked ? "Factura" : "Boleta") + " no existe. Desea crearla?", "Sistema FUYAO - Mensaje de Confirmación", MessageBoxButtons.YesNo,
                    MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button2) == DialogResult.Yes)
                {
                    frmVentas frm = new frmVentas(Constantes.VENTA_FACTURA_ID);
                    frm.ShowDialog();
                    if (!string.IsNullOrEmpty(frm.NroComprobanteVenta) && !string.IsNullOrEmpty(frm.NroSerieComprobanteVenta))
                    {
                        oVenta = bc.getVentaforGuiaRemision((this.rdbFactura.Checked ? "F" : "B"), frm.NroSerieComprobanteVenta, frm.NroComprobanteVenta);                    
                        cargarDatosVenta(oVenta);
                    }
                }
                else
                {
                    MessageBox.Show("Ingrese el número de la guía interna para cargar los datos", "Sistema FUYAO - Validando Opción", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    this.txtNumeroGuia.Enabled = true;
                    this.btnCargar.Enabled = true;
                    this.txtNumeroGuia.Focus();
                    this.txtNumeroComprobante.Text = "000000";
                }
            }
            else cargarDatosVenta(oVenta);
        }

        private void cargarDatosVenta(Venta oVenta)
        {
            if (oVenta.DetalleVentas.Count != 0)
            {
                DetalleGuiaRemision oDetalleGuiaRemision;
                foreach (DetalleVenta oDetalleVenta in oVenta.DetalleVentas)
                {
                    oDetalleGuiaRemision = new DetalleGuiaRemision();
                    oDetalleGuiaRemision.ProductoID = oDetalleVenta.ProductoID;
                    oDetalleGuiaRemision.Cantidad = Convert.ToInt32(Utilitarios.IsNumericWithReturnValue(oDetalleVenta.Cantidad));
                    beGuiaRemision.DetalleGuiaRemisions.Add(oDetalleGuiaRemision);
                }
            }
            this.txtRazonSocial.Text = oVenta.Cliente.NombreCliente;
            this.txtRazonSocial.Tag = oVenta.ClienteID;
            this.txtRuc.Text = oVenta.Cliente.RUC;
            this.txtDni.Tag = oVenta.Cliente.DNI;
            this.dgvDetalles.DataSource = null;
            this.dgvDetalles.DataSource = oVenta.DetalleVentas;
            ErrorProv.SetError(txtRazonSocial, "");
            this.txtNumeroGuia.Enabled = false;
            this.btnCargar.Enabled = false;
        }          

        private void txt_TextChanged(object sender, EventArgs e)
        {
            TextBox tbx = (TextBox)sender;
            ErrorProv.SetError(tbx, "");
        }

        private void txt_KeyPress(object sender, KeyPressEventArgs e)
        {
            Utilitarios.vSoloNumeros(e);
        }

        private void txt_Leave(object sender, EventArgs e)
        {
            TextBox tbx = (TextBox)sender;
            if (string.IsNullOrEmpty(tbx.Text)) tbx.Text = "000000";
        }       

        private void BuscarGuiaInterna()
        {
            Pedido bePedido = bc.getGuiaInternaByNroPedido(txtNumeroGuia.Text.Trim());

            if (bePedido == null)
            {
                MessageBox.Show("El # de pedido no es existe", "Sistema FUYAO - Validando opción", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                return;
            }

            beVenta = new Venta();
            beVenta.DetalleVentas = new List<DetalleVenta>();
            beVenta.Cliente = new Cliente();

            beVenta.ClienteID = bePedido.ClienteID;
            beVenta.Cliente.RUC = bePedido.Cliente.RUC;
            beVenta.Cliente.DNI = bePedido.Cliente.DNI;
            beVenta.Cliente.NombreCliente = bePedido.Cliente.NombreCliente;
            beVenta.Cliente.Direccion = bePedido.Cliente.Direccion;
   
            DetalleVenta oDetalleVenta;
            foreach (DetallePedido oDetallePedido in bePedido.DetallePedidos)
            {
                oDetalleVenta = new DetalleVenta();

                oDetalleVenta.ProductoID = oDetallePedido.ProductoID;
                oDetalleVenta.Cantidad = Convert.ToInt32(Utilitarios.IsNumericWithReturnValue(oDetallePedido.Cantidad));
                oDetalleVenta.CodigoProducto = oDetallePedido.CodigoProducto;
                oDetalleVenta.DescripcionProducto = oDetallePedido.DescripcionProducto;
                oDetalleVenta.PrecioUnitario = oDetallePedido.PrecioUnitario;
                oDetalleVenta.Importe = Convert.ToDecimal(Utilitarios.IsNumericWithReturnValue(oDetallePedido.PrecioUnitario)) * Convert.ToInt32(Utilitarios.IsNumericWithReturnValue(oDetallePedido.Cantidad));
                beVenta.DetalleVentas.Add(oDetalleVenta);
            }
            cargarDatosVenta(beVenta);
        }

        private void btnCargar_Click(object sender, EventArgs e)
        {
            if (txtNumeroGuia.Text == "000000")
            {
                ErrorProv.SetError(txtNumeroGuia, "Ingrese el número de guía interna");
                return;
            }

            if (txtNumeroGuia.Text.Length != 6)
            {
                ErrorProv.SetError(txtNumeroGuia, "Formato incorrecto del número de guía interna");
                return;
            }
            BuscarGuiaInterna();
        }

        private void btnImprimirDatos_Click(object sender, EventArgs e)
        {
            if (validarCamposRequeridos())
            {
                if (this.txtNumeroComprobante.Text != "000000") beGuiaRemision.NroVenta1 = Convert.ToInt32(txtNumeroComprobante.Text);
                beGuiaRemision.ClienteID = Convert.ToInt32(this.txtRazonSocial.Tag);
                beGuiaRemision.PuntoLlegada = this.txtPuntoLlegada.Text.Trim();
                beGuiaRemision.PuntoPartida = this.txtPuntoPartida.Text.Trim();
                beGuiaRemision.Serie = this.txtSerie.Text.Trim();
                beGuiaRemision.NroGuiaRemision = Convert.ToInt32(this.txtNroDocumentoGuia.Text);
                beGuiaRemision.ModeloAuto = this.txtMarca.Text.Trim();
                beGuiaRemision.PlacaAuto = this.txtPlaca.Text.Trim();
                beGuiaRemision.NombreConductor = this.txtChofer.Text.Trim();
                beGuiaRemision.Brevete = this.txtLC.Text.Trim();
                beGuiaRemision.NombreTransportista = this.txtNombreTransportista.Text.Trim();
                beGuiaRemision.RUCTransportista = this.txtRucTransportista.Text.Trim();
                beGuiaRemision.MotivoTraslado = (int?)Convert.ToInt32(this.cboMotivoTraslado.SelectedValue);
                beGuiaRemision.DescMotivoTraslado = this.txtDescMotivoTraslado.Text.Trim();
                beGuiaRemision.FechaIniTraslado = this.dtpFecTraslado.Value;
                beGuiaRemision.CreadoPor = VariablesGlobales.GlobalEnUsuario.UsuarioID;

                GuiaRemisionId = bc.InsertarGuiaRemision(beGuiaRemision);
                if (GuiaRemisionId > 0)
                {
                    MessageBox.Show("Se ingresaron los datos correctamente", "Sistema FUYAO - Mensaje de Confirmación", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    cerrarForm();
                }
                else
                    MessageBox.Show("Error al ingresar los datos, contacte con Sistemas", "Sistema FUYAO - Mensaje de Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);

            }
        }

        private void cerrarForm()
        {
            this.Close();
            action = true;
        }

        private bool validarCamposRequeridos()
        {
            StringBuilder sb = new StringBuilder();
            sb.Append("Ingrese los campos requeridos: " + System.Environment.NewLine);

            bool isValid = true;

            if (String.IsNullOrEmpty(txtSerie.Text))
            {
                ErrorProv.SetError(txtSerie, "No se ha cargado el número de serie para la guía de remisión");
                sb.Append("- Número de serie de la guía de remisión" + System.Environment.NewLine);
                isValid = false;
            }
            else if (txtNroDocumentoGuia.Text == "000000")
            {
                ErrorProv.SetError(txtNroDocumentoGuia, "Ingrese el número de guía de remisión");
                sb.Append("- Número de la guía de remisión" + System.Environment.NewLine);
                isValid = false;
            }
            else if (txtNumeroComprobante.Text.Length != 6)
            {
                ErrorProv.SetError(txtNumeroComprobante, "Formato incorrecto del número de comprobante");
                isValid = false;
            }

            //if (String.IsNullOrEmpty(txtNumeroComprobante.Text) || txtNumeroComprobante.Text == "000000")
            //{
            //    sb.Append("- Nro de comprobante" + System.Environment.NewLine);
            //    ErrorProv.SetError(txtNumeroComprobante, "Ingrese Nro de comprobante");
            //    isValid = false;
            //}

            if (String.IsNullOrEmpty(txtPuntoLlegada.Text))
            {
                sb.Append("- Punto de llegada" + System.Environment.NewLine);
                isValid = false;
            }

            if (String.IsNullOrEmpty(txtRazonSocial.Text))
            {
                sb.Append("- Razón Social del destinatario" + System.Environment.NewLine);
                ErrorProv.SetError(txtRazonSocial, "Ingrese la Razón Social del destinatario");
                isValid = false;
            }

            if (dgvDetalles.RowCount == 0)
            {
                sb.Append("- No se agregaron registros al detalle de la guía de remisión" + System.Environment.NewLine);
                isValid = false;
            }

            if (cboMotivoTraslado.SelectedIndex == 0 || cboMotivoTraslado.SelectedIndex == -1)
            {
                sb.Append("- Seleccione el motivo de traslado" + System.Environment.NewLine);
                ErrorProv.SetError(cboMotivoTraslado, "Seleccione el motivo de traslado");
                isValid = false;
            }

            if (!isValid)
                MessageBox.Show(sb.ToString(), "Sistema FUYAO - Validando opción", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);

            return isValid;
        }

        private void cboMotivoTraslado_SelectedIndexChanged(object sender, EventArgs e)
        {
            ErrorProv.SetError(cboMotivoTraslado, "");
            if(cboMotivoTraslado.SelectedIndex == 3) this.txtDescMotivoTraslado.Enabled = true;
        }
      

    }
}
